home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
lib
/
tex
/
inputs
/
figplace.tex
< prev
next >
Wrap
Text File
|
1991-05-20
|
7KB
|
198 lines
%
%Date: Tue, 25 Oct 88 14:11:06 +0100
%From: Joost Zalmstra <mcvax!nat.vu.nl!jjaz@uunet.UU.NET>
%Subject: Re:Page Make-up Challenge
%
%Maybe the following set of macros can contribute to the solution of
%the problem posed by David Rogers in TeXhax #86. It implements a floating
%insertion with the following properties:
% - Every insertion must be put in a \vbox. Customised macros can then
% be used to place the white space for the figure and the figure caption
% in this box.
% - The order in which these \vbox-es are inserted is maintained.
% - No more than two boxes are placed on one page: the first on the top
% and the second on the bottom of the page.
%
%The proposed macro \figplace should create a \vbox with the correct layout
%of the figure and then call \addfigure to put it in the insertionlist:
%
%\def\figplace#1#2#3#4{setbox0=\vbox{%
%% here call macros to place figure and caption
%}
%\addfigure0}
%
%Note that the space separating the figure from the text should not
%be included in the \vbox. The skipregister \figureskip is used for this
%purpose.
%
%The macros are written in plain TeX, in fact the output routine given
%here is an extension of the plain output routine (TeX-book page 364).
%
%The basic idea is that figures that won't fit on the current page
%are kept on a list (the \box \figlist). This list is checked after
%a \shipout and if not empty a maximum of two \vboxes is inserted
%(using plains \topins) for the next page. As the insertions are \vboxes
%it is easy to split the insertion and put one at the top and one at
%the bottom of the page.
%
%Two further refinements should be mentioned here.
%1) If the figures on a page take so much room that less than a specified
%amount of space (given in dimen register \minpagesize) is left for
%the text, this text is shifted through to the next page.
%2) By inserting a \vbox with height \vsize (created by \vbox to \vsize..)
%a page insert is created. No extra \figureskip will be include in this case.
%
%I have tested these macros with real input (16 pages with on the first
%page the insertion of several figures) and it seems to work on the moment.
%However, I'm not a TeX guru and I would expect that these macros can be
%improved. One of the problems left is te fact that \addfigures must
%be called in horizontal mode ( \vadjust won't work). I would therefore
%apreciate comments, both on the macros as they stand and on how this
%contributes to the Challenge.
%
%Joost Zalmstra.
%
%jjaz%nat.vu.nl@hearn.bitnet
\newbox\figlist
\newcount\figuresonpage \figuresonpage=0
\newcount\figuresonlist \figuresonlist=0
\newskip\figureskip \figureskip=1.2 pc plus 1 pc
\newdimen\pagesize
\newdimen\minpagesize \minpagesize=5 pc
\newdimen\figuresizeonpage
\def\addfigure#1{% add figure in box #1 to the document
\ifnum\figuresonpage>1 % allready two figures on this page
\addtolist{#1}% % so save for later
\else
\ifnum\figuresonlist>0 % figlist is not empty
\addtolist{#1} % so save for later
\else % no figures left over, so try to fit this one
\dimen0=\ht#1
\ifdim\dimen0<\vsize% not a pagesize figure
\advance\dimen0 by \dp#1 % size of the box
\advance\dimen0 by \figureskip % extra space below or above
\fi
\advance\dimen0 by \pagetotal
\ifdim\dimen0>\pagegoal % no space on this page
\addtolist{#1} % so save for later
\else
\advance\dimen0 by \figuresizeonpage
\ifdim\dimen0>\dimen\topins % exceding maximum insertion size
\addtolist{#1} % so save for later
\else
\figureinsert{#1} % insert the figure
\fi
\fi
\fi
\fi
}
\def\addtolist#1{% add box #1 to figlist
\global\setbox\figlist=\vbox{%
\nointerlineskip
\box#1
\unvbox\figlist}
\global\advance\figuresonlist by 1
}
\def\figureinsert#1{% insert figure on this page
\ifdim\ht#1<\vsize
\insert\topins{\vbox{%
\ifnum\figuresonpage=0
\unvbox#1\vskip\figureskip % skip below the figure
\else
\vskip\figureskip\unvbox#1 % skip above the figure
\fi
}}
\else
\pageinsert
\unvbox#1
\endinsert
\fi
\global\advance\figuresonpage by 1
\global\advance\figuresizeonpage by \ht#1
\global\advance\figuresizeonpage by \dp#1
\global\advance\figuresizeonpage by \figureskip
}
\def\checkfiglist{% see if there is a figure in the list that will
% fit on the next page
\ifnum\figuresonlist>0
\global\setbox\figlist=\vbox{%
\unvbox\figlist
\setbox0=\lastbox
\global\advance\dimen0\ht0
\ifdim\ht0<\vsize
\global\advance\dimen0 by \dp0
\global\advance\dimen0 by \figureskip
\fi
\ifdim\dimen0>\vsize
\vbox{\box0} % no room ; replace the figure
\else
\ifdim\dimen0>\dimen\topins
\vbox{\box0}
\else
\global\advance\figuresonlist by -1
\fi
\fi
\global\setbox0=\box0
}
\else
{\setbox1=\box0 % make box0 void
\global\setbox0=\box0}
\fi
}
% Borrowing the macros from plain TeX
\catcode`@=11
\output{\myoutput}
\def\myoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
\advancepageno
\global\figuresonpage=0
\dimen0=0pt
\global\figuresizeonpage = 0pt
\checkfiglist % check if there is figure waiting and return it in box 0
\ifvoid0 % nothing left
\else
\figureinsert0% insert this figure
\checkfiglist % check for a second figure
\ifvoid0\else
\figureinsert0
\fi
\fi
\ifvoid255\else\unvbox255\penalty\outputpenalty\fi % unused page back on list
\ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
\def\pagecontents{%
\ifnum\figuresonpage>0 % check for insertion of figures
\unvbox\topins % place the figure(s) on top
\ifnum\figuresonpage=2
\setbox0=\lastbox % remove the second figure
\fi
\setbox1=\lastbox
\unvbox1
\fi
% Check box 255
\pagesize=\ht255
\advance\pagesize by \dp255 % determine size of box 255
\ifdim\pagesize>\minpagesize
\dimen@=\dp255 \unvbox255 % the real page contents
\else
\message{tekstsize = \the\ht255, \the\dp255}
\ifdim\ht255=0pt % box is empty
\else
\vfil % to small so leave for next page
\fi
\fi
%
\ifnum\figuresonpage=2
\box0 % the second figure
\fi
\ifvoid\footins\else % footnote info is present
\vskip\skip\footins
\footnoterule
\unvbox\footins\fi
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
\catcode`@=12 % at signs no longer letters